package net.mingsoft.document.dao;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.mingsoft.document.action.q.FileModifyQuery;
import net.mingsoft.document.action.q.FileQuery;
import net.mingsoft.document.action.q.FileSearchQuery;
import net.mingsoft.document.action.r.FileEntityResponse;
import net.mingsoft.document.action.r.FileSearchResponse;
import net.mingsoft.document.action.r.statistic.FileStatisticResponse;
import net.mingsoft.document.entity.FileEntity;
import net.mingsoft.statistic.action.q.SummaryQuery;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author gengfa
 * @date 22/01/13
 */
public interface FileDao {

    Page<FileSearchResponse> selectListByName(@Param("page") Page<?> page, @Param("query") FileSearchQuery query);

    /**
     * 根据ID查询文件
     * @param id 文件
     * @param fileType 文件类型
     * @return 路径
     */
    FileEntity selectOne(@Param("id") String id, @Param("fileType") String fileType);

    String selectFileCodeOrName(@Param("fileCode") String fileCode, @Param("fileName") String fileName, @Param("id") String id);

    List<FileEntity> selectListByParentId(@Param("parentId") String parentId);
    List<FileEntity> selectFileListByParentId(@Param("parentId") String parentId);
    List<FileEntity> selectFileListByName(@Param("fileName") String fileName);

    FileEntity selectExistSameName(@Param("fileName") String fileName, @Param("id") String id, @Param("parentDir") String parentDir);
    FileEntity selectExistSameCode(@Param("fileCode") String fileCode, @Param("id") String id, @Param("parentDir") String parentDir);

    /**
     * 查询文件列表
     * @param page 分页
     * @param query 查询条件
     * @return 文件列表
     */
    Page<FileEntity> selectList(@Param("page") Page<?> page, @Param("query") FileQuery query);

    /**
     * 查询文件列表
     * @param page 分页
     * @param query 查询条件
     * @return 文件列表
     */
    Page<FileEntityResponse> selectListResponse(@Param("page") Page<?> page, @Param("query") FileQuery query);

    /**
     * 根据ID查询
     * @param ids id列表
     * @return 文件列表
     */
    List<FileEntity> selectListByIds(List<String> ids);

    /**
     * 文件名和父文件夹ID
     * @param fileName 文件名
     * @param parentDir 父文件夹
     * @return 文件实体
     */
    FileEntity selectByFileNameAndParentDir(@Param("fileName") String fileName, @Param("parentDir") String parentDir);

    String selectFileTypeById(String id);

    int updateFileNameAndFileCode(@Param("query")FileModifyQuery query);

    int updateFilePath(@Param("id") String id, @Param("filePath") String filePath);

    /**
     * 插入文件
     * @param entity 文件实体
     * @return 插入结果
     */
    int insertOne(FileEntity entity);

    /**
     * 插入目录
     * @param entity 文件实体
     * @return 插入结果
     */
    int insertDir(FileEntity entity);

    /**
     * 更新状态
     * @param id 文件ID
     * @param status 更新状态
     * @return 更新结果
     */
    int updateStatus(@Param("id") String id, @Param("status") String status);

    /**
     * 更新父级目录/移动
     * @param id 文件ID
     * @param parentDir 目录
     * @return 更新结果
     */
    int updateParentDir(@Param("id") String id,
                        @Param("parentDir") String parentDir,
                        @Param("filePath")  String filePath,
                        @Param("fileUrl") String fileUrl,
                        @Param("newDirName") String newDirName);

    List<FileStatisticResponse> countFileGroupByType();

    int incrCount(SummaryQuery summaryQuery);

    int incrCountAvg(SummaryQuery summaryQuery);

    int pubCount(SummaryQuery summaryQuery);

    int pubCountAvg(SummaryQuery summaryQuery);
}
